Come Funziona la Memoria Virtuale

Quando le memorie erano piccole costose di programmatore passava molto tempo cercare di comprimere programmi nel ristretto spazio di memoria disponibile. Quando ciò non era possibile si ricorreva spesso all’overlay.

Il programmatore divideva il programma in un numero di parti, chiamati overlay, ognuna delle quali poteva stare memoria. Ad esempio per far funzionare un programma veniva caricato dal disco il primo overlay che veniva eseguito e una volta terminato veniva caricato il secondo overlay e così via… Inutile dire come questa tecnica fosse molto scomoda e laboriosa.

Nel 1961 un gruppo di ricercatori di Manchester propose un metodo per eseguire automaticamente il processo di overlay. Per rendere ciò possibile si ricorse alla separazione dei concetti di spazio di indirizzamento in posizione di memoria:

esempio
16bit di indirizzamento à memoria di 4096 parole
In ogni istante possibile accedere a sole 4096 parole di memoria ma NON necessariamente a quelle gli indirizzi da 0 a 4095.
Infatti quando si accede all’indirizzo 4096 questo viene automaticamente tradotto nell’indirizzo zero della memoria principale (4097 in 1,&,81191 in 4095)
Questa tecnica di overlay automatico viene comunemente detta paginazione e di pezzi di programma letti dal disco si chiamano pagine.

Gli indirizzi virtuali:
Indirizzi virtuali = gli indirizzi a cui fa riferimento il programma in esecuzione
indirizzi fisici = sono appunto gli indirizzi fisici della memoria
Specifiche tabelle o mappe collegano indirizzi virtuali a quelli fisici.
Grazie a questa tecnica il programmatore può scrivere programmi senza curarsi affatto dell’utilizzo della memoria. Infatti i programmi possono caricare o memorizzare qualsiasi parola nello spazio di indirizzamento virtuale o saltare qualsiasi istruzione anche se è memoria fisica non è sufficiente.

Memory Menagement Unit (MMU):
Risulta essere un dispositivo che si occupa della traduzione del nudo di pagina virtuale nel corrispondente numero di pagina fisica. Può essere posizionato sul chip della CPU o separatamente.
La MMU contiene una tabella delle pagine con una riga per ogni pagina dello spazio di indirizzamento virtuale.
ogni riga ha :
– 1 bit valido che indica sulla pagina corrispondente presento assente memoria principale
– l’indirizzo di pagina fisica corrispondente

Un esempio significativo:
La MMU riceve l’indirizzo da 32 bit
separa il 12 bit che rappresentano il numero di pagina virtuale dagli altri eventi che sono invece significativi
La MMU verificasse la pagina richiesta già presente memoria centrale e analizza il bit valido
se il bit valido = 1 allora la pagina presente memoria e dalla tabella ricava dove cercare;
se il bit valido = 0 allora si verifica un errore di pagina (page fault) e di controllo viene passato al sistema operativo con il meccanismo della eccezione.

La frammentazione:
Ad un programma e dai suoi dati vengono assegnati un numero intero di pagine tuttavia non sempre dati riempiono questo numero intero di pagine e così siamo spreco di memoria.
Per ridurre lo spreco di memoria allora si può creare pagine più piccole. Ma pagine più piccole implicano più pagine, e più grandi dimensioni della MMU con conseguente riduzione di efficienza dei trasferimenti su disco.d’altra parte portano meno errori di pagina.

La segmentazione:
In alcuni casi potrebbe essere più utile avere spazi di indirizzamento diversi per diverse tipologie di informazione.
Tipi di informazioni:
cornice del programma
stack per le chiamate procedura
tabella delle costanti

Semplificando vengono così a crearsi dei segmenti che sono entità logiche nota il programmatore. Si tratta di spazi di indirizzamento indipendenti ed ogni segmento contiene una tipologia di informazioni diversa.

Il vantaggio principale della segmentazione è che semplifica la gestione delle strutture di dati che variano nel tempo.